/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package managedBeans;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ViewScoped;
import javax.ejb.EJB;
import entidades.Periodo;
import entidades.EstadoType;
import entidades.AsignacionCursoPK;
import entidades.AsignacionCurso;
import entidades.Curso;
import entidades.Salon;
import ejb.PeriodoEJB;
import ejb.AsignacionCursoEJB;
import ejb.SalonEJB;
import ejb.CursoEJB;
import java.util.List;
import java.util.ArrayList;
import javax.faces.model.SelectItem;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.primefaces.model.DualListModel;
import managedBeans.util.JsfUtil;

/**
 *
 * @author Renato
 */
@ManagedBean(name="IntersemestralesController")
@SessionScoped
public class IntersemestralesController {
    private Periodo periodo = new Periodo();
    @EJB
    private PeriodoEJB periodoEJB;
    @EJB
    private CursoEJB cursoEJB;
    @EJB
    private AsignacionCursoEJB asignacionCursoEJB;
    @EJB
    private SalonEJB salonEJB;

    private DualListModel<AsignacionCurso> cursos;
    private AsignacionCurso curso;
    

  

    public AsignacionCurso getCurso() {
        return curso;
    }

    public void setCurso(AsignacionCurso curso) {
        this.curso = curso;
    }


    public AsignacionCursoEJB getAsignacionCursoEJB() {
        return asignacionCursoEJB;
    }

    public void setAsignacionCursoEJB(AsignacionCursoEJB asignacionCursoEJB) {
        this.asignacionCursoEJB = asignacionCursoEJB;
    }

    public DualListModel<AsignacionCurso> getCursos() {
       
        return cursos;
    }

    public void setCursos(DualListModel<AsignacionCurso> cursos) {
        this.cursos = cursos;
    }
    
    public Periodo getPeriodo() {
        return periodo;
    }

    public CursoEJB getCursoEJB() {
        return cursoEJB;
    }

    public SalonEJB getSalonEJB() {
        return salonEJB;
    }

    public void setSalonEJB(SalonEJB salonEJB) {
        this.salonEJB = salonEJB;
    }

    public void setCursoEJB(CursoEJB cursoEJB) {
        this.cursoEJB = cursoEJB;
    }


    public void setPeriodo(Periodo periodo) {
        this.periodo = periodo;
    }
    public PeriodoEJB getPeriodoEJB() {
        return periodoEJB;
    }

    public void setPeriodoEJB(PeriodoEJB periodoEJB) {
        this.periodoEJB = periodoEJB;
    }

    /** Creates a new instance of IntersemestralesController */

    public IntersemestralesController() {
    }
    public void altaPeriodo(){
        periodoEJB.create(periodo);
        periodo = new Periodo();
    }

    public List<Periodo> getPeriodos(){
        return periodoEJB.findAll();
    }

    public List<SelectItem> getEstados(){
        List<SelectItem> items = new ArrayList<SelectItem>();
        for(EstadoType et:EstadoType.values()){
            items.add(new SelectItem(et));
        }
        return items;
    }
    public List<SelectItem> getSalones(){
        List<SelectItem> items = new ArrayList<SelectItem>();
        List<Salon> salones = salonEJB.findAll();
        for(Salon s:salones){
            items.add(new SelectItem(s,s.getNombre()));
        }
        return items;
    }
    public void doAgregarPeriodo(){
        periodoEJB.create(periodo);
        periodo = new Periodo();
    }

    public void doEliminarPeriodo(Periodo periodoSeleccionado){
        periodoEJB.remove(periodoSeleccionado);
    }

    public String editarPeriodo(Periodo periodo){
        this.periodo = periodo;

        return "editarPeriodo";
    }

    public void doEditarPeriodo(){
        String idPeriodo = periodo.getIdPeriodo();
        periodo.getPrecio().setIdPeriodo(idPeriodo);
        periodoEJB.edit(periodo);
        JsfUtil.addSuccessMessage("periodoEditado");
    }

    public String regresar(){
        cursos = null;
        periodo = new Periodo();
        return "periodos.faces";
    }
    public String asignarCursos(Periodo periodo){
         String idPeriodo = periodo.getIdPeriodo();
         List<AsignacionCurso> seleccionados = asignacionCursoEJB.findByIdPeriodo(idPeriodo);//this.periodo .getAsignacionCursoList();
     
        for(AsignacionCurso as:seleccionados){
            System.out.println(as.getAsignacionCursoPK().getIdCurso()+" : "+as.getAsignacionCursoPK().getIdPeriodo());
        }
        List<AsignacionCurso> noSeleccionados = new ArrayList<AsignacionCurso>();
        List<Curso> allCursos = cursoEJB.findAll();
        for(Curso cs:allCursos){
             System.out.println(cs.getNombreCurso());
            Boolean contiene = false;
            for(AsignacionCurso as:seleccionados){
                if(as.getCurso().equals(cs)){
                    contiene = true;
                    as.setGuardado(true);
                    break;
                }
            }
            if(!contiene){
                AsignacionCurso ac = new AsignacionCurso(idPeriodo, cs.getIdCurso());
                ac.setCurso(cs);
                /*ac.setGuardado(false);
                ac.setCupo(0);*/
                noSeleccionados.add(ac);
            }
        }
        cursos = new DualListModel<AsignacionCurso>(noSeleccionados,seleccionados);
        return "asignarCursos.faces";
    }
    
    public void ajaxGuardar(ActionEvent ae){
       curso = (AsignacionCurso)ae.getComponent().getAttributes().get("curso");
       System.out.print("nombre"+curso.getCurso().getNombreCurso());
        System.out.print("nombre"+curso.getCupo());
         System.out.print("nombre"+curso.getHorarioInicio());
    
       JsfUtil.addSuccessMessage("cursoEditado");
    }
    public void ajaxGuardar(){
        System.out.print("Nombre"+curso.getCurso().getNombreCurso());
        System.out.print("Cupo"+curso.getCupo());
        System.out.print("Horario"+curso.getHorarioInicio());
        asignacionCursoEJB.edit(curso);
     //   periodo.getAsignacionCursoList().add(curso);
        JsfUtil.addSuccessMessage("cursoEditado");
    }

    @FacesConverter(forClass=Curso.class)
    public static class CursoConverter implements Converter{
         public Object getAsObject(FacesContext facesContext, UIComponent component, String value){
            if(value == null || value.length() == 0){
                return null;
            }
            IntersemestralesController controller = (IntersemestralesController)facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "IntersemestralesController");
          
            return controller.getCursoEJB().find(value);
         }

         public String getAsString(FacesContext facesContext,
                              UIComponent uiComponent,
                              Object obj){

              if (obj == null) {
                return null;
                }
             if(obj instanceof Curso){
                Curso pq = (Curso)obj;
                return pq.getIdCurso();
             }else{
                throw new IllegalArgumentException("Se espera de tipo Curso");
             }

         }
    }
    @FacesConverter(forClass=AsignacionCurso.class,value="AsignacionCursoConverter")
    public static class AsignacionCursoConverter implements Converter{
         public Object getAsObject(FacesContext facesContext, UIComponent component, String value){
            if(value == null || value.length() == 0){
                return null;
            }
            IntersemestralesController controller = (IntersemestralesController)facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "IntersemestralesController");
            System.out.print("cad:"+value);
            String cad[] = value.split(":");
            AsignacionCursoPK pk= new AsignacionCursoPK(cad[0],cad[1]);
            AsignacionCurso ac =  controller.asignacionCursoEJB.find(pk);
            if(ac==null){
                ac = new AsignacionCurso(pk, null, null, null, null);
                ac.setCurso(controller.cursoEJB.find(cad[1]));
            }
            return ac;
         }
      
         public String getAsString(FacesContext facesContext,
                              UIComponent uiComponent,
                              Object obj){

              if (obj == null) {
                return null;
                }
             if(obj instanceof AsignacionCurso){
                AsignacionCurso pq = (AsignacionCurso)obj;
                return pq.getAsignacionCursoPK().getIdPeriodo()+":"+pq.getAsignacionCursoPK().getIdCurso();
             }else{
                throw new IllegalArgumentException("Se espera de tipo Curso");
             }

         }
    }
    @FacesConverter(forClass=Salon.class)
    public static class SalonConverter implements Converter{
        public Object getAsObject(FacesContext facesContext, UIComponent component, String value){
             if(value == null || value.length() == 0){
                return null;
            }
            IntersemestralesController controller = (IntersemestralesController)facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "IntersemestralesController");
            return controller.salonEJB.find(value);

        }
        public String getAsString(FacesContext facesContext,
                              UIComponent uiComponent,
                              Object obj){
             if (obj == null) {
                return null;
                }
             if(obj instanceof Salon){
                Salon pq = (Salon)obj;
                return pq.getIdSalon();
             }else{
                throw new IllegalArgumentException("Se espera de tipo Salon");
             }


        }
    }


}
